﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Entidades;
using System.Transactions;
using System.Data.Linq;

namespace LogicaDeNegocio
{
    public class PedidoBL
    {
        private BaseDeDatosEntities modeloEntidades;
        public BaseDeDatosEntities ModeloEntidades
        {
            get
            {
                if (modeloEntidades == null)
                    return modeloEntidades = new BaseDeDatosEntities();
                else
                    return modeloEntidades;
            }
        }
        
        public PedidoBL()
        {
        }

        public int IngresarPedido(string nomCli, string dirCli, string telefono, string problema, string descripcion)
        {
            using (TransactionScope ts = new TransactionScope())
            {
                try
                {
                    Pedido nuevoPedido = new Pedido()
                    {
                        TipoDeProblema = problema,
                        Descripción = descripcion
                    };

                    ModeloEntidades.AddToPedido(nuevoPedido);
  
                    DetallePedido nuevoDetallePedido = new DetallePedido()
                    {
                        EstadoDelPedido = "Pendiente",
                        NombreCliente = nomCli,
                        DirecciónCliente = dirCli,
                        TeléfonoCliente = telefono,
                        Pedido = nuevoPedido
                    };

                    ModeloEntidades.AddToDetallePedido(nuevoDetallePedido);
                    ModeloEntidades.SaveChanges();
                    ts.Complete();
                    return nuevoDetallePedido.Pedido.idPedido;
                }
                catch (Exception ex)
                {
                    System.Diagnostics.EventLog.WriteEntry("Application", ex.Message);
                    return -1;
                    //falta tirar una excepcion en la página
                }
            }
        }

        public List<Pedido> ObtenerPedidos()
        {
            var pedidos = ModeloEntidades.Pedido;
            return pedidos.ToList();
        }

        public Pedido ObtenerPedido(int id)
        {
            var pedido = ModeloEntidades.Pedido.Where(u => u.idPedido == id).FirstOrDefault();
            return pedido;
        }

        public void AsignarPedido(int idPedido, int nroEmp)
        {
            var update = (from p in ModeloEntidades.Pedido
                         where p.idPedido == idPedido
                         select p).FirstOrDefault();

            update.Tecnico = (from t in ModeloEntidades.Tecnico
                             where t.NroEmpleado == nroEmp
                             select t).FirstOrDefault();
            
            update.DetallePedido = ( from dt in ModeloEntidades.DetallePedido
                                     where dt.idPedido == idPedido
                                     select dt).FirstOrDefault();
            update.DetallePedido.EstadoDelPedido = "Asignado";                         

            ModeloEntidades.SaveChanges();
            
        }

        public List<Pedido> ObtenerPedidosPorTecnico(int nroEmp)
        {
            var pedidos = ModeloEntidades.Pedido.Where(u => u.Tecnico.NroEmpleado == nroEmp);
            return pedidos.ToList();
        }

        public List<Pedido> ObtenerPedidosPendientes()
        {
            var pedidos = from p in ModeloEntidades.Pedido
                          join dp in ModeloEntidades.DetallePedido on p.idPedido equals dp.idPedido
                          where dp.EstadoDelPedido == "Pendiente" && p.Tecnico != null
                          select p;

            return pedidos.ToList();
        }

        public List<Pedido> ObtenerPedidosSinFinalizarDeTecnico(int nroEmp)
        {
            var pedidos = from dp in ModeloEntidades.DetallePedido
                          join p in ModeloEntidades.Pedido on dp.idPedido equals p.idPedido
                          join t in ModeloEntidades.Tecnico on p.Tecnico.NroEmpleado equals t.NroEmpleado
                          where dp.EstadoDelPedido != "Terminada" && t.NroEmpleado == nroEmp
                          select p;

            return pedidos.ToList();
        }
    }
}
